[SpringBoot] エクスポートしたjarファイルをEC2で実行する〜RedshiftでCOPYコマンドを使いS3からLoadする〜
はじめに
前回は定時実行でS3にアクセスするプロジェクトを作りましたが今回はRedshiftにCOPYコマンドを送るプロジェクトを作ります。
環境
STS Version: 3.8.0
作業
- S3にGZIP形式のTSVファイルがある
- SpringBootでエクスポートしたファイルをEC2にアップロードして実行 アップロードの手順はこちら
- 定時実行されて、RedshiftでCOPYコマンドを実行してS3のファイルをLoadする
コード
@Service public class ScheduledService { @Autowired Copy copy; // 1日1回 0時に実行 @Scheduled(cron = "0 0 * * * *", zone = "Asia/Tokyo") public void fixedRate() { copy.copyFromS3ToRedshift(); } }
@Component public class Copy { @Autowired Settings settings; public void copyFromS3ToRedshift() { EnvironmentVariableCredentialsProvider credentials = new EnvironmentVariableCredentialsProvider(); String sql = "copy TABLE_NAME from '" + "s3://BUCKET_NAME/FILE_NAME.tsv.gz" + "' CREDENTIALS 'aws_access_key_id=" + credentials.getCredentials().getAWSAccessKeyId() + ";aws_secret_access_key=" + credentials.getCredentials().getAWSSecretKey() + "'GZIP DELIMITER '\t' REMOVEQUOTES;"; Properties properties = new Properties(); properties.setProperty("user", "DB_USER_NAME"); properties.setProperty("password","DB_PASSWORD"); try (Connection connection = DriverManager.getConnection("RED_SHIFT_DB_URL",properties)) { Statement statement = connection.createStatement(); statement.execute(sql); } catch (SQLException e) { e.printStackTrace(); } } }
9,14,16行目で予め環境変数に設定したcredentialsを取得しています。
23行目のRED_SHIFT_DB_URLは
マネジメントコンソール → Redshift → Clustersで任意のClusterを選択したら表示されるJDBC URLをコピペします。 (jdbc:redshift:xxxxxxxxxxxxxxxxx:5439/db_nameみたいなやつです)
compile fileTree(dir: 'libs', include: '*.jar')
build.gradleのdependencesに上記記述をして、プロジェクトルートのlibsにJDBCドライバを配置します。
プロジェクト名
├ src/
├ libs/ ←ここ
├ build/
└ build.gradle
JDBCドライバの取得は
マネジメントコンソールのRedshiftの左ペインのConnect Clientの 2. Download Amazon Redshift drivers → JDBC Driverからダウンロードできます。
3.Get cluster connection URL ここからでも上記のJDBC URLを確認することができます。
この後にはまったのですが、これだけではまだEC2上でjarファイルを起動してもRedshiftにアクセスできません。
EC2からRedshiftにアクセスするために該当のClusterを選択しVPC Security GroupsでEC2からのインバウンドを許可しないといけないので
EC2のIPアドレスを指定します。
これでEC2からRedshiftへCOPYコマンドを実行することができます。
最後に
他にもハマりどころがありましたので、少し頭の中で整理できたら追記します。